'''
自定义返回处理
'''

# 导入控制返回的JSON格式的类
from rest_framework.renderers import JSONRenderer
import logging

logger = logging.getLogger('mylogger')


class CustomRenderer(JSONRenderer):  # 继承自 JSONRenderer
    # 重构 render 方法
    """
    统一响应中间键（拦截器）
    self: 这个参数表示类实例本身，允许在方法中访问类的属性和其他方法。
    data: 这是需要被渲染的数据。在这个方法中，data 参数是要被转换成特定格式（比如 JSON 或 XML）的内容。
    accepted_media_type=None: 这是一个可选参数，表示客户端接受的媒体类型。它告诉方法需要以何种媒体类型来呈现数据。默认为 None，表示未指定特定的媒体类型。
    renderer_context=None: 这也是一个可选参数，通常是一个字典，包含了关于渲染过程中上下文的信息。这个上下文可能包括关于请求的信息、响应的状态等。默认情况下为 None，意味着在没有指定渲染器上下文时不会传递任何额外的信息。
    """

    def render(self, data, accepted_media_type=None,
               renderer_context=None):  # 重写了 render() 方法，该方法接收响应的数据、接受的媒体类型和渲染器上下文作为参数。
        # 检查是否存在 renderer_context
        if renderer_context:
            # 如果存在 renderer_context，处理响应的数据格式
            # 如果 data 是一个字典
            if isinstance(data, dict):
                # 有三种情况
                # 1. 返回成功，直接调用枚举类型，返回 200
                # 2. 返回成功，带数据，直接返回数据，
                # 3. 返回失败，直接调用枚举类型 返回500

                # 如果返回成功 调用了枚举类型，可以直接赋值，不用默认值
                # 如果返回成功 带数据，用默认值
                # 如果返回失败，则直接用枚举类型

                # 如果在那就不是成功带数据的
                if 'message' and 'code' in data:
                    msg = data.get('message')
                    code = data.get('code')
                    ret = {
                        'code': code,
                        'msg': msg,
                        'data': 'null',
                    }
                else:
                    msg = 'ok'
                    code = 200
                    ret = {
                        'code': code,
                        'msg': msg,
                        'data': data,
                    }
            # 如果 data 不是字典类型，则设置默认的消息和状态码
            else:
                msg = 'ok'
                code = 200
                ret = {
                    'code': code,
                    'msg': msg,
                    'data': data,
                }
            renderer_context["response"].status_code = code
            # 返回 JSON 格式的数据
            return super().render(ret, accepted_media_type, renderer_context)
        else:
            # 如果 renderer_context 不存在，直接返回原始数据的 JSON 格式
            return super().render(data, accepted_media_type, renderer_context)